/*
* 凯撒加密
* 20240410
* 张震
* */
public class CaesarCipher {
    /**
     * 进行凯撒加密
     * @param key 密钥
     * @param input 明文
     * @return 密文
     */
    public String encrypt(int key, String input) {
        //保证密钥是0-25
        key = ((key % 26) + 26) % 26;
        //用于存储密文的字符串
        StringBuilder output = new StringBuilder();
        //遍历明文字符串的每个字符
        for (char m : input.toCharArray()) {
            //判断是否是大写字母
            if (Character.isUpperCase(m)) {
                //把大写字母A-Z转为数字0-25
                int m_int = m - 65;
                //执行公式 C = (M + K) MOD 26
                int c_int = (m_int + key) % 26;
                //把数字0-25转为密文字母A-Z
                char c = (char) (c_int + 65);
                //把密文字符添加到字符串output中
                output.append(c);
                //判断是否小写字母
            } else if (Character.isLowerCase(m)) {
                //把小写字母a-z转为数字0-25
                int m_int = m - 97;
                //执行公式 C = (M + K) MOD 26
                int c_int = (m_int + key) % 26;
                //把数字0-25转为密文字母a-z
                char c = (char) (c_int + 97);
                //把密文字符添加到字符串output中
                output.append(c);
            } else {
                //如果不是字母，则不做加密解密
                output.append(m);
            }
        }
        //返回密文字符串
        return output.toString();
    }

    /**
     * 解密函数
     * @param key 密钥
     * @param input 密文
     * @return 明文
     */
    public String decrypt(int key, String input){
        //执行公式 C = (M - K) MOD 26，所以把k变为负数，明文进行一次加密算法即可得到明文
        return this.encrypt(-key, input);
    }

    public static void main(String[] args) {

    }
}